package com.example.rabbitmq.demo1_modes.consumer.mode01_simple;

import com.example.rabbitmq.enums.RabbitmqQueueNamesEnum;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author songyahui
 * @Date 2023/7/6 20:04
 * @Description 消费消息
 */
public class SimpleConsumer {

    //队列的名称
    public static void consumeMessage() throws IOException, TimeoutException {
        //创建工厂
        ConnectionFactory factory = new ConnectionFactory();
        //工厂IP 连接rabbitmq队列
        factory.setHost("127.0.0.1");
        //设置用户名称
        factory.setUsername("guest");
        //设置密码
        factory.setPassword("guest");
        //创建连接
        Connection connection = factory.newConnection();
        //获取信道
        Channel channel = connection.createChannel();
        //声明 接受消息
        DeliverCallback deliverCallback = (consumerTag, message) -> {
            System.out.println(message.getProperties().getDeliveryMode()+"::"+new String(message.getBody()));
            //由于设置了手动消费，这里必须执行 channel.basicAck(...) 等回应性质的方法
            //如果不执行则该消息仍然被队列视为待消费的消息，如果其它消费者空闲也会来再次消费该消息，这将导致消息严重违反幂等原则
        };
        //取消消息回调
        CancelCallback cancelCallback = consumerTag -> {
            System.out.println("消息消费被中断");
        };
        //消费者消费消息：消费哪个队列、消费成功之后是否要自动应答（true：自动应答，false：手动应答）、消费失败的回调、取消消息的回调
//        System.out.println(channel.basicConsume(RabbitmqQueueNamesEnum.QUEUE_NAME_SIMPLE.queueName, true, deliverCallback, cancelCallback));
        System.out.println(channel.basicConsume(RabbitmqQueueNamesEnum.QUEUE_NAME_HELLO.queueName, true, deliverCallback, cancelCallback));
    }
}
